package Roteador;

import java.net.InetAddress;


/**
 * Classe que representa um nó vizinho.
 * @author David, Iury, Milena
 *
 */
public class Neighbour {
	private String id;
	private InetAddress ip;
	private int port;
	private long lastSent;
	private int cost;
	private boolean on;
	
	/**
	 * Cria um novo vizinho com id, ip, porta, custo e ativo.
	 * @param id
	 * @param ip
	 * @param port
	 * @param cost
	 * @param on
	 */
	public Neighbour(String id, InetAddress ip, int port, int cost, boolean on) {
		this.setId(id);
		this.setIp(ip);
		this.setPort(port);
		this.setCost(cost);
		this.setOn(on);
		this.setLastSent(System.currentTimeMillis());
	}

	/**
	 * Cria um novo vizinho apenas com ip e porta
	 * @param ip
	 * @param port
	 */
	public Neighbour(InetAddress ip, int port) {
		this.setId("");
		this.setIp(ip);
		this.setPort(port);
		this.setCost(1);
		this.setOn(true);
	}

	/**
	 * Modifica a hora que o vizinho foi criado pela última vez
	 * @param lastSent novo horário
	 */
	public void setLastSent(long lastSent) {
		this.lastSent = lastSent;
	}

	/**
	 * Retorna a última vez que o vizinho foi criado
	 * @return hora que ele foi criado
	 */
	public long getLastSent() {
		return lastSent;
	}
	
	/**
	 * Muda a porta do vizinho
	 * @param port nova porta
	 */
	public void setPort(int port) {
		this.port = port;
	}

	/**
	 * Retorna a porta atual do vizinho
	 * @return o número da porta.
	 */
	public int getPort() {
		return port;
	}

	/**
	 * Seta um ip para o vizinho
	 * @param ip novo ip
	 */
	public void setIp(InetAddress ip) {
		this.ip = ip;
	}

	/**
	 * Pega o ip atual do vizinho
	 * @return ip atual.
	 */
	public InetAddress getIp() {
		return ip;
	}
	
	/**
	 * Muda o id do vizinho
	 * @param id novo id
	 */
	public void setId(String id) {
		this.id = id;
	}

	/**
	 * Retorna o id atual
	 * @return id atual
	 */
	public String getId() {
		return id;
	}

	/**
	 * Retorna o custo deste vizinho para um roteador
	 * @param cost o custo.
	 */
	public void setCost(int cost) {
		this.cost = cost;
	}

	/**
	 * Muda o seu custo
	 * @return novo custo
	 */
	public int getCost() {
		return cost;
	}
	

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object arg0) {
		if (arg0 instanceof Neighbour){
			return ((Neighbour) arg0).getIp().equals(getIp()) && 
					((Neighbour) arg0).getPort() == getPort() ;
		}
		return false;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override	
	public String toString() {
		return "Ip: " +getIp().toString() + " Porta : " + getPort();
	}

	/**
	 * Seta se um roteador está ligado ou não
	 * @param on status
	 */
	public void setOn(boolean on) {
		this.on = on;
	}

	/**
	 * Retorna se o vizinho está ligado
	 * @return true se sim, false caso contrário.
	 */
	public boolean isOn() {
		return on;
	}
}
